1 module hip.api.data.ini; 2 3 4 struct IniVar 5 { 6 string name; 7 string value; 8 9 pragma(inline, true) string get() => value; 10 pragma(inline, true) string opAssign(string v) () => value = v; 11 12 version(Have_util) 13 { 14 import hip.util.variant; 15 private Variant data; 16 IniVar opAssign(IniVar var){this.name = var.name; this.value = var.value; this.data = var.data; return this;} 17 18 T get(T)() 19 { 20 static if(is(T == string)) 21 return get; 22 else 23 { 24 if(data.type == Type.undefined) 25 data = Variant.make!T(value); 26 return data.get!T; 27 } 28 } 29 pragma(inline, true) auto opAssign(T)(T v) => data.set!T(v); 30 } 31 string toString() const @safe pure nothrow{return name~" = "~ value;} 32 } 33 34 struct IniBlock 35 { 36 string name; 37 string comment; 38 IniVar[string] vars; 39 40 string toString() const @safe pure 41 { 42 string ret = "["~name~"]\n"; 43 foreach (v; vars) 44 ret~= v.toString(); 45 return ret; 46 } 47 pragma(inline, true) auto opDispatch(string member)() => vars[member]; 48 alias vars this; 49 } 50 51 /** 52 * Usage: 53 ```d 54 //If not found, use 2 as default 55 ini.tryGet!ubyte("buffering.count", 2); 56 //Alternative usage 57 ini.buffering.count.get!ubyte 58 ``` 59 */ 60 interface IHipIniFile 61 { 62 ref IniBlock[string] blocks(); 63 const(string[]) getErrors() const; 64 bool noError() const; 65 version(Have_util) 66 { 67 IniVar* getIniVar(string varPath); 68 T tryGet(T)(string varPath, T defaultVal = T.init) 69 { 70 IniVar* v = getIniVar(varPath); 71 if(v is null) 72 return defaultVal; 73 return v.get!T; 74 } 75 } 76 auto opDispatch(string member)() => blocks[member]; 77 }